﻿using System;
using System.Linq;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Configuration;
using System.ComponentModel;

namespace QuanLyKTX
{
    using Telerik.WinControls.UI;
    using Telerik.WinControls.Data;
    using Telerik.WinControls.UI.Localization;
    using DAL;
    using Utilities;

    public partial class frm_Employees : RadForm
    {
        private RadContextMenu contextMenu;

        #region Properties

        public tbl_NhanVien TempNhanVien { get; set; }

        #endregion

        #region Private methods

        private void SetDefaultGridView()
        {
            radGridView_NhanVien.AutoGenerateColumns = false;
            GroupDescriptor descriptor = new GroupDescriptor();
            descriptor.GroupNames.Add("column_TenVaiTro", ListSortDirection.Ascending);
            radGridView_NhanVien.GroupDescriptors.Add(descriptor);
        }

        private bool InsNhanVien(Guid maVaiTro, string ho, string ten, DateTime ngaySinh, string diaChi, string soDienThoai, string Email, string tenDangNhap, string matKhau)
        {
            bool valReturn = true;
            using (var db = new QuanLyKTXDataContext())
            {
                NameValueCollection appSettings = ConfigurationManager.AppSettings;
                string passPhrase = appSettings["passPhrase"];
                string initVector = appSettings["initVector"];
                int passInter = Convert.ToInt32(appSettings["passInteration"]);
                string hashingAlgorithm = appSettings["hashingAlgorithm"];
                string saltPass = appSettings["saltPass"];

                // Trường hợp bị trùng tên đăng nhập
                if (db.tbl_NhanViens.Where(p => p.TenDangNhap == tenDangNhap).Count() > 0)
                {
                    MessageBox.Show("Tên đăng nhập đã được đăng ký. Vui lòng chọn tên khác.");
                    radTextBox_TenDangNhap.SelectAll();
                    radTextBox_TenDangNhap.Focus();
                    valReturn = false;
                }
                else
                {
                    db.tbl_NhanViens.InsertOnSubmit(new tbl_NhanVien
                    {
                        MaNhanVien = Guid.NewGuid(),
                        MaVaiTro = maVaiTro,
                        TenDangNhap = tenDangNhap,
                        MatKhau = RijndaelSimple.Encrypt(matKhau, passPhrase, saltPass, hashingAlgorithm, passInter, initVector, 256),
                        Ho = ho,
                        Ten = ten,
                        DiaChi = diaChi,
                        NgaySinh = ngaySinh,
                        SoDienThoai = soDienThoai,
                        Email = Email,
                        QuanTriHeThong = false,
                        KhoaTaiKhoan = false

                    });
                    db.SubmitChanges();
                    valReturn = true;
                }
            }
            return valReturn;
        }

        private void BindGridView()
        {
            using (var db = new DAL.QuanLyKTXDataContext())
            {
                var result = from p in db.tbl_NhanViens
                             join q in db.tbl_VaiTros on p.MaVaiTro equals q.MaVaiTro
                             where p.KhoaTaiKhoan == false || p.QuanTriHeThong == false
                             select new
                             {
                                 q.MaVaiTro,
                                 q.TenVaiTro,
                                 p.MaNhanVien,
                                 p.Ho,
                                 p.Ten,
                                 p.NgaySinh,
                                 p.DiaChi,
                                 p.SoDienThoai,
                                 p.Email
                             };

                radGridView_NhanVien.DataSource = result.ToList();
                radGridView_NhanVien.AutoGenerateColumns = false;
            }
        }

        private void BindDropDownListVaiTro()
        {
            using (var db = new QuanLyKTXDataContext())
            {
                radDropDownList_VaiTro.DataSource = db.tbl_VaiTros.ToList();
                radDropDownList_VaiTro.ValueMember = "MaVaiTro";
                radDropDownList_VaiTro.DisplayMember = "TenVaiTro";
            }
        }

        private void ResetInsForm()
        {
            radTextBox_Ho.Clear();
            radTextBox_Ten.Clear();
            radTextBox_DiaChi.Clear();
            radTextBox_DienThoai.Clear();
            radTextBox_Email.Clear();
            radTextBox_TenDangNhap.Clear();
            radTextBox_MatKhau.Clear();
            radTextBox_XacNhanMatKhau.Clear();
            radTextBox_Ho.Focus();
        }

        private void InitContextMenu()
        {
            contextMenu = new RadContextMenu();
            RadMenuItem menuDelete = new RadMenuItem("Xóa");
            menuDelete.Click += new EventHandler(menuDelete_Click);

            RadMenuItem menuEdit = new RadMenuItem("Sửa");
            menuEdit.Click += new EventHandler(menuEdit_Click);

            contextMenu.Items.Add(menuDelete);
            contextMenu.Items.Add(menuEdit);
        }

        private void DelNhanVien(Guid maNhanVien)
        {
            DialogResult dlgResult = MessageBox.Show("Bạn có chắc không sử dụng thông tin này?", "Cảnh báo", MessageBoxButtons.YesNo);

            if (dlgResult.Equals(DialogResult.Yes))
            {
                using (var db = new QuanLyKTXDataContext())
                {
                    frm_Main fMain = (frm_Main)MdiParent;
                    if (db.tbl_NhanViens.Where(p => p.MaNhanVien == fMain.NVDangNhap.MaNhanVien).Count() > 0)
                    {
                        MessageBox.Show("Không thể thực thi lệnh vì Tài khoản đang được sử dụng.");
                    }
                    else
                    {
                        var result = db.tbl_NhanViens.Where(p => p.MaNhanVien == maNhanVien).Single();
                        result.KhoaTaiKhoan = true;
                        db.SubmitChanges();
                    }
                }
            }

        }

        private void UpdThongTinNhanVien(Guid maNhanVien, Guid maVaitro, string ho, string ten, DateTime ngaySinh, string diaChi, string soDienThoai, string email)
        {
            using (var db = new QuanLyKTXDataContext())
            {
                var result = db.tbl_NhanViens.Where(p => p.MaNhanVien == maNhanVien).Single();
                result.MaVaiTro = maVaitro;
                result.Ho = ho;
                result.Ten = ten;
                result.NgaySinh = ngaySinh;
                result.DiaChi = diaChi;
                result.SoDienThoai = soDienThoai;
                result.Email = email;

                db.SubmitChanges();
            }
        }

        private void BindThongTinNhanVienToForm(Guid maNhanVien)
        {
            using (var db = new QuanLyKTXDataContext())
            {
                var result = (from p in db.tbl_NhanViens
                              where p.MaNhanVien == maNhanVien
                              select p).FirstOrDefault();

                TempNhanVien = result;

                radTextBox_Ho.Text = result.Ho;
                radTextBox_Ten.Text = result.Ten;
                radDateTimePicker_NgaySinh.Value = Convert.ToDateTime(result.NgaySinh);
                radTextBox_DiaChi.Text = result.DiaChi;
                radTextBox_DienThoai.Text = result.SoDienThoai;
                radTextBox_Email.Text = result.Email;
                radTextBox_TenDangNhap.Text = result.TenDangNhap;

                radDropDownList_VaiTro.SelectedValue = result.MaVaiTro;
            }
        }

        private void LockUnlockTTDangNhap(bool lockForm)
        {
            if (lockForm)
            {
                radTextBox_TenDangNhap.ReadOnly = true;
                radTextBox_MatKhau.ReadOnly = true;
                radTextBox_XacNhanMatKhau.ReadOnly = true;
            }
            else
            {
                radTextBox_TenDangNhap.ReadOnly = false;
                radTextBox_MatKhau.ReadOnly = false;
                radTextBox_XacNhanMatKhau.ReadOnly = false;
            }
        }

        #endregion

        #region Event methods

        public frm_Employees()
        {
            InitializeComponent();
            RadGridLocalizationProvider.CurrentProvider = new MyCustomRadGridLocalizationProvider();
        }

        private void frm_Employees_Load(object sender, EventArgs e)
        {
            WindowState = FormWindowState.Maximized;
            SetDefaultGridView();
            BindGridView();
            BindDropDownListVaiTro();
            InitContextMenu();
        }

        private void radButton_Luu_Click(object sender, EventArgs e)
        {

            #region Thêm mới dữ liệu

            if (!radButton_BoQua.Visible) // Ứng với trường hợp thêm mới dữ liệu
            {
                if (radTextBox_TenDangNhap.Text.Equals(String.Empty) || radTextBox_MatKhau.Text.Equals(String.Empty) || radTextBox_XacNhanMatKhau.Text.Equals(String.Empty))
                {
                    MessageBox.Show("Phần thông tin đăng nhập phải có đầy đủ thông tin.");
                }
                else
                {
                    if (radTextBox_MatKhau.Text.Equals(radTextBox_XacNhanMatKhau.Text))
                    {
                        if (radTextBox_Email.Text.Length > 0) // Nếu email được nhập. Kiểm tra định dạng email
                        {
                            if (Validation.CheckEmail(radTextBox_Email.Text.Trim()))
                            {
                                if (InsNhanVien(new Guid(radDropDownList_VaiTro.SelectedValue.ToString()), radTextBox_Ho.Text.Trim(), radTextBox_Ten.Text.Trim(), radDateTimePicker_NgaySinh.Value, radTextBox_DiaChi.Text, radTextBox_DienThoai.Text, radTextBox_Email.Text, radTextBox_TenDangNhap.Text, radTextBox_MatKhau.Text))
                                {
                                    BindGridView();
                                    ResetInsForm();
                                }
                            }
                            else
                            {
                                MessageBox.Show("Sai định dạng Email. Vui lòng kiểm tra lại.");
                            }
                        }
                        else
                        {
                            if (InsNhanVien(new Guid(radDropDownList_VaiTro.SelectedValue.ToString()), radTextBox_Ho.Text.Trim(), radTextBox_Ten.Text.Trim(), radDateTimePicker_NgaySinh.Value, radTextBox_DiaChi.Text, radTextBox_DienThoai.Text, radTextBox_Email.Text, radTextBox_TenDangNhap.Text, radTextBox_MatKhau.Text))
                            {
                                BindGridView();
                                ResetInsForm();
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Phần nhập Mật khẩu và Xác nhận mật khẩu phải trùng khớp.");
                        radTextBox_XacNhanMatKhau.Focus();
                    }
                }
            }

            #endregion

            #region Cập nhật dữ liệu

            else // Ứng với trường hợp cập nhật lại dữ liệu
            {
                if (radTextBox_Email.Text.Length > 0)
                {
                    if (Validation.CheckEmail(radTextBox_Email.Text.Trim()))
                    {
                        UpdThongTinNhanVien(TempNhanVien.MaNhanVien, new Guid(radDropDownList_VaiTro.SelectedValue.ToString()), radTextBox_Ho.Text, radTextBox_Ten.Text, radDateTimePicker_NgaySinh.Value, radTextBox_DiaChi.Text, radTextBox_DienThoai.Text, radTextBox_Email.Text);
                        BindGridView();
                        radButton_BoQua.Visible = true;
                        ResetInsForm();
                        LockUnlockTTDangNhap(false);
                        TempNhanVien = null;
                    }
                    else
                    {
                        MessageBox.Show("Sai định dạng Email. Vui lòng kiểm tra lại.");
                    }
                }

                else
                {
                    UpdThongTinNhanVien(TempNhanVien.MaNhanVien, new Guid(radDropDownList_VaiTro.SelectedValue.ToString()), radTextBox_Ho.Text, radTextBox_Ten.Text, radDateTimePicker_NgaySinh.Value, radTextBox_DiaChi.Text, radTextBox_DienThoai.Text, radTextBox_Email.Text);
                    BindGridView();
                    radButton_BoQua.Visible = true;
                    ResetInsForm();
                    LockUnlockTTDangNhap(false);
                    TempNhanVien = null;
                }

            }

            #endregion

        }

        void menuEdit_Click(object sender, EventArgs e)
        {
            BindThongTinNhanVienToForm(new Guid(radGridView_NhanVien.CurrentRow.Cells[2].Value.ToString()));
            radTextBox_Ho.Focus();
            radButton_BoQua.Visible = true;
            LockUnlockTTDangNhap(true);
        }

        void menuDelete_Click(object sender, EventArgs e)
        {
            DelNhanVien(new Guid(radGridView_NhanVien.CurrentRow.Cells[2].Value.ToString()));
            BindGridView();
        }

        private void radGridView_NhanVien_ContextMenuOpening(object sender, ContextMenuOpeningEventArgs e)
        {
            if (!radGridView_NhanVien.CurrentRow.IsSystem)
            {
                e.ContextMenu = contextMenu.DropDown;
            }
        }

        private void radButton_BoQua_Click(object sender, EventArgs e)
        {
            ResetInsForm();
            radButton_BoQua.Visible = false;
            LockUnlockTTDangNhap(false);
        }

        #endregion

    }
}
